#ifndef GAMEMAP_H_
#define GAMEMAP_H_

#include <vector>
#include <map>

#include "CellCoordinate.h"
#include "PathCoordinate.h"
#include "SiteCoordinate.h"
#include "Cell.h"
#include "Path.h"
#include "Site.h"
#include "CellNumber.h"

namespace catan
{

class GameMap
{
public:
	GameMap();
	void reset();
	Cell &getCell(CellCoordinate cellCoordinate);
	Path &getPath(PathCoordinate pathCoordinate);
	Site &getSite(SiteCoordinate siteCoordinate);
	std::map<VerticalCardinal, Path*> getPathsNeighboringCell(Cell cell);
	std::map<HorizontalCardinal, Site*> getSitesNeighboringCell(Cell cell);
	std::map<VerticalCardinal, Cell*> getCellsNeighboringPath(Path path);
	std::map<HorizontalCardinal, Site*> getSitesNeighboringPath(Path path);
	std::map<HorizontalCardinal, Cell*> getCellsNeighboringSite(Site site);
	std::map<HorizontalCardinal, Path*> getPathsNeighboringSite(Site site);
	std::map<HorizontalCardinal, Path*> getPathsNeighboringPath(Path path);
	std::map<HorizontalCardinal, Site*> getSitesNeighboringSite(Site site);
	std::vector<Cell*> getCellsOfNumber(CellNumber cellNumber);
	bool isHarbor(Site &site);
	CellType getHarborType(Site &site);

private:
	std::map<CellCoordinate, Cell> cells;
	std::map<SiteCoordinate, Site> sites;
	std::map<PathCoordinate, Path> paths;
};

}

#endif /*GAMEMAP_H_*/
